package com.tianyadu.mmall.controller.async;

import io.micrometer.core.instrument.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

/**
 * 消息监听器
 *
 * @author xueyj
 * @date 2019-09-29 14:16
 */
@Slf4j
@Component
public class QueueListener implements ApplicationListener<ContextRefreshedEvent> {

    /**
     * 注入消息队列信息
     */
    @Autowired
    private MockQueue mockQueue;

    /**
     * 注入请求结果信息
     */
    @Autowired
    private DeferredResultHolder deferredResultHolder;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //  容器启动，单开线程，监听订单结果信息，若直接执行，每次监听会新开一个线程，导致线程阻塞，内存溢出等问题的发生
        new Thread(() -> {
            while (true) {
                //  当订单完成信息不为空，则下单成功，完成订单信息，否则继续监听
                if (StringUtils.isNotBlank(mockQueue.getCompleteOrder())) {
                    //  获取订单完成信息
                    String orderNumber = mockQueue.getCompleteOrder();
                    log.info("返回订单处理结果:【{}】", orderNumber);
                    //  将订单结果信息返回至浏览器，响应请求结果
                    deferredResultHolder.getMap().get(orderNumber).setResult("place order success");
                    //  将已执行订单信息置空，避免订单重复执行
                    mockQueue.setCompleteOrder(null);
                } else {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();
    }
}